const qs = require("querystring");
const bodyParser = require("body-parser");
const multer = require("multer"); //multer - node.js 中间件，用于处理 enctype="multipart/form-data"（设置表单的MIME编码）的表单数据。
const cors = require("cors");
const session = require("express-session");
const expressJwt = require("express-jwt");
const { sercetKey } = require("./../config");

const middleWareIndex = (app) => {
  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({ extended: true }));
  app.use(multer({ dest: "/tmp/" }).array("files"));
  app.use(cors());
  // unless 配置的是以什么为开头的都不需要验证权限
  // 只要配置成功了 express-jwt 就可以直接将解析出来的对象直接挂载到req.user上
  app.use(
    expressJwt({ secret: sercetKey, algorithms: ["HS256"] }).unless({
      path: [/^\/route_demo/, /^\/login/],
    })
  );
  // app.use(
  //   session({
  //     secret: "keyboard cat", //secret 的值可以是任意字符串
  //     resave: false, //固定写法
  //     saveUninitialized: true, //固定写法
  //     cookie: ("name", "value", { maxAge: 5 * 60 * 1000, secure: false }),
  //   })
  // );
  //! session options
  // 1. name - cookie的名字（原属性名为 key）。（默认：’connect.sid’）
  // 2. store - session存储实例
  // 3. secret - 用它来对session cookie签名，防止篡改
  // 4. cookie - session cookie设置 （默认：{ path: ‘/‘, httpOnly: true,secure: false, maxAge: null }）
  // 5. genid - 生成新session ID的函数 （默认使用uid2库）
  // 6. rolling - 在每次请求时强行设置cookie，这将重置cookie过期时间（默认：false）
  // 7. resave - 强制保存session即使它并没有变化 （默认： true, 建议设为：false）
  // 8. proxy - 当设置了secure cookies（通过”x-forwarded-proto” header ）时信任反向代理。当设定为true时，
  // ”x-forwarded-proto” header 将被使用。当设定为false时，所有headers将被忽略。当该属性没有被设定时，将使用Express的trust proxy。
  // 9. saveUninitialized - 强制将未初始化的session存储。当新建了一个session且未设定属性或值时，它就处于未初始化状态。在设定一个cookie前，这对于登陆验证，减轻服务端存储压力，权限控制是有帮助的。（默认：true）
  // 10. unset - 控制req.session是否取消（例如通过 delete，或者将它的值设置为null）。这可以使session保持存储状态但忽略修改或删除的请求（默认：keep）

  //! 销毁session的方法
  // req.session.destroy(function(err){
  //   res.send("退出登录！"+err);
  // });

  queryString(app);
};

const queryString = (req, res, next) => {
  let chunk = "";

  req.on("data", () => {
    chunk += req.data;
  });

  req.on("end", () => {
    const body = qs.parse(chunk);
    req.body = body;
    next();
  });
};

module.exports = middleWareIndex;
